/**
主要回顾：抽象类

抽象类：
    1.使用 abstract 关键字修饰需要抽象的方法
    2.使用 abstract 关键字修饰类名
    3.一个非抽象类继承了抽象类，则必须实现所有抽象方法
    4.抽象类不能实例化
    5.抽象类可以没有抽象方法
    6.抽象类可以有构造函数
    7.不能与 private、static、final 共同修饰同一个方法

*/

abstract class Animal{
    String name;
    String color;
    
    public Animal(String name, String color){
        this.name = name;
        this.color = color;
    }
    
    public abstract void run();
    
    public void eat(){
        System.out.println("eating...");
    }
}

class Dog extends Animal{
    public Dog(String name, String color){
        super(name, color);
    }
    
    public void run(){
        System.out.println(name + " running...");
    }
}

class Fish extends Animal{
    public Fish(String name, String color){
        super(name, color);
    }
    public void run(){
        System.out.println(name + " swimming...");
    }
}

class LearnAbstract {
    public static void main(String[] args) {
        Dog dog = new Dog("doggy", "yellow");
        Fish fish = new Fish("fishy", "white");
        
        dog.run();
        dog.eat();
        
        fish.run();
        fish.eat();
        
    }
}